perm filename SIG1.MAC[1,ALS] blob sn#001121 filedate 1972-08-04 generic text, type T, neo UTF8
00010	TITLE SIG
00020	
00030	ENTRY SIG
00040	
00045		;Signature table processing routine.
00050		;Version with line by line computation and P-table spreading.
00060		;Also contains TABLET section and negative gates. July 10 1972.
00065		;Modified for event tables. July 31 1972.
00070	
00080	EXTERNAL TABLES,HINT,UPCNT
00090	EXTERNAL INDAT,INCNT,FLAG
00095	INTERNAL ECOUNT,EVENTS,EVDUR,EVAVE,EVAVE2,EVAVE3,EVSURE,EVENT2,EVENT3
00100	
00110	;    Name   Rel. Loc.	Usage
00120		OUT=0		;Most recent table output in leftmost bits
00130		SIGTYP=1	;Table type,# of inputs,Gate sign and level
00140		LEARN=2		;4 PH if Q table or pointer to feature if P
00150		GATE=3		;Gating byte pointer
00160		IN1=4		;Byte pointer to first input
00170		IN2=5		;Byte pointer to second input
00180		IN3=6		;Byte pointer to third input
00190		IN4=7		;Byte pointer to fourth input
00200		IN5=10		;Byte pointer to fifth input
00210		IN6=11		;Byte pointer to sixth input
00220		SIGTAB=12	;Start of actual table
00230	
00240	EXTERNAL	TABLET,SEGC,TFLAG
00250	
00260	;	Name	Rel.Loc	Usage
00270		OUT=	0	;Most recent outputs
00280	 	SIGTYP=	1	;SIXBIT name of tablet
00290		ALDATA=	2	;Unused(1),Level(3),toler(2),excnt(2)
00300				;SFLAG(5),exsum(5),segsum(18)
00310		OUT1=	3	;Next older outputs
00320		IN1=	4	;Byte pointer to input
00330	
00340	;Index register assignments
00350	;Regester	Usage
00360	Z=0		; general purpose register
00370	I=1		;Used to index between tables (incremented by 74)
00380	J=2		;Used to index within  tables
00390	K=3		;Special purpose indexing and general use
00400	L=4
00410	M=5		;Used to hold counter bit
00420	N=6
00430	P=7		;Used to index INDAT files
00440	Q=10		;Used to hold mask
00450	R=11		;Used to hold quantized marker
00460	S=12
00470	T=13		;Reserved exclusively for the address of TABLES
00480	F=14
00490	H=15		;Used to hold HINT word repeated
00500	PO=16		;NO LONGER USED
00510	X=17		;Used to index in buckets
00520	
00530	SIG:	0
00540		MOVEM	17,SAVE+17
00550		MOVE	17,[XWD 0,SAVE]
00560		BLT	17,SAVE+16
00570	
00580	TIN1:	MOVE	Z,@0(16)
00590		MOVE	T,TABLES	;Necessary for IN pointers to work
00600		MOVE	Z,INDAT
00610		HRRM	Z,TIN2
00620		MOVE	Z,INCNT
00630		HRRM	Z,TIN3		;START OF INCNT
00635		HRRM	Z,.+1
00637		AOS	0		;ADD TO INCNT ONCE ONLY
00640		MOVE	H,HINT
00650		LSH	H,6
00660		ADD	H,HINT
00670		LSH	H,6
00680		ADD	H,HINT
00690		LSH	H,6
00700		ADD	H,HINT
00710		SETZ	P,		;To index input data
00720		MOVEI	M,20		;Counter bit for I table
00730		MOVE	Q,[777777777760]	;Mask
00740		MOVE	I,TABLES	;To index tables
00750	TIN2:	MOVE	J,0(P)		;Get INDAT value into index
00752		CAIGE	J,0		;Limit minimum to 0
00754		MOVEI	J,0
00756		CAILE	J,77		;Limit maximum to 63
00758		MOVEI	J,77
00760		ADD	J,I
00770		MOVE	K,SIGTAB(J)	
00780		ADDM	M,SIGTAB(J)
00790		MOVE	L,OUT(I)
00800		LSHC	K,-3		;Shift out oldest and add newest output
00810		MOVEM	L,OUT(I)	
00820	TIN3:	MOVE	N,0		;Get count from INCNT for bucket size
00845		CAILE	N,20000		;Stop updating at this number
00857		JRST	TIN6
00870	TIN3A:	TRNE	N,7		;Is it time to update
00880		JRST	TIN6		;No
00890		LSH	N,-3		;Divide by 8 to get number for each
00900	TIN3B:	LSH	N,4		;To line up with count field
00910		MOVEI	K,77		;Use to count entries
00920		MOVE	J,I
00930		SETZ	R,		;Quantized output marker starts at 0
00940		SETZ	Z,		;To accumulate total number of references
00950	TIN4:	ANDM	Q,SIGTAB(J)	;Save count only and zero output field
00960		ADD	Z,SIGTAB(J)	;Count in current bucket
00970		ORM	R,SIGTAB(J)	;Add output field
00980		CAMGE	Z,N		;Is it time to change output marker
00990		JRST	TIN5		;No
01000		CAIGE	R,7		;Guard against too large value
01010		ADDI	R,1		;Can change safely
01020		SUB	Z,N		;Keep overshoot
01030	TIN5:	AOS	J
01040		SOJGE	K,TIN4
01050	TIN6:	ADDI	I,112		;To go to the next table
01060		AOS	P		;Keep INDAT index in step
01070		SKIPN	SIGTYP(I)	;Test table type
01080		JRST	TIN2		;Still more input tables
01090		MOVEM	I,ISAV#		;Save start of P-Q region
01100	PQ1:	SKIPN	SIGTYP(I)	;A 0 value NOW means end of tables
01110		JRST	XXX		;Go to tablets
01120		LDB	K,GATE(I)	;Is this table to be used
01130		LDB	L,GPOINT	;Get gating threshold
01140		SUB	K,L		;Is level high enough
01141	
01142		CAIGE	L,10		;Test for negative gate
01143		JRST	.+4
01144		ADDI	K,10
01145		JUMPLE	K,PQ2
01146		SKIPA
01147	
01150		JUMPGE	K,PQ2		; Yes
01160		LDB	L,TPOINT	; Find table type
01170		JUMPN	L,PQ1A		;Must be a Q table
01180		MOVE	L,OUT(I)	;Fix table output for gate off case
01190		LSH	L,-3		;Introuce a 0
01200		MOVEM	L,OUT(I)	;Output and go to next table
01210		JRST	PP2
01220	
01230	PQ1A:	MOVE	K,OUT(I)
01240		MOVE	L,OUT+112(I)
01250		LSHC	K,-22
01260		MOVEM	L,OUT+112(I)
01270		MOVE	L,OUT(I)
01280		LSH	L,-22		;Shift 18 places for Q table
01290		OR	L,[700000000000]	;Add toe NOT-ANY output for Q
01300		MOVEM	L,OUT(I)
01310		JRST	PQ8		;Go to next table
01320	
01330	PQ2:	LDB	J,IN1(I)	;J used to accumulate index to line
01340		LDB	K,IN2(I)
01350		LDB	L,NPOINT	;To get number of inputs from SIGDAT
01360		CAILE	L,3		;Is it a 2- or a 3-input type
01370		JRST	PQ6		;NO, it is a 6-input table
01380		CAILE	L,2		;Is it a 2 input table
01390		JRST	PQ3		;No, it has 3 inputs
01400		DPB	K,D2N2		;Deposit as 2nd of 2 inputs
01410		JRST	PQX
01420	
01430	PQ3:	DPB	K,D2N3		;Deposit as 2nd of 3 inputs
01440		LDB	K,IN3(I)
01450		DPB	K,D3N3		;Deposit as 3rd of 3
01460		JRST	PQX
01470	
01480	PQ6:	DPB	K,D2N6		;Deposit as 2nd of 6
01490		LDB	K,IN3(I)
01500		DPB	K,D3N6		;3 of 6
01510		LDB	K,IN4(I)
01520		DPB	K,D4N6		;4 of 6
01530		LDB	K,IN5(I)
01540		DPB	K,D5N6		;5 of 6
01550		LDB	K,IN6(I)
01560		DPB	K,D6N6		;6 of 6
01570	PQX:	ADD	J,I		;Add start of table I address to J
01580		LDB	K,TPOINT	;Now find whether P or Q table
01590		JUMPN	K,QQ1		;A 1 in this field means Q
01600		MOVE	K,SIGTAB(J)	;Get new output
01610		MOVE	L,OUT(I)
01620		LSHC	K,-3		;Displace oldest and add newest to left
01630		MOVEM	L,OUT(I)
01640		JUMPE	H,PP2		;A 0 in H means no learning
01650		LDB	L,LEARN(I)	;Gets proper bit from PONY word
01660		MOVSI	K,4		;Adds to not-on count
01670		SKIPE	L		;Means sig.feature not indicated
01680		MOVEI	K,20		;Adds to on count
01690		ADDM	K,SIGTAB(J)	;Add learning
01700		LDB	K,GDPNT
01710		LDB	Z,BADPNT
01720		ADD	Z,K
01730		LSH	K,4		;Multiply by 16
01740		IDIV	K,Z
01750		MOVE	Z,SPREAD(K)	;Convert to range 0 to 7
01760		DPB	Z,OTXPT		;Updated output for this entry
01770	PP2:	ADDI	I,112
01780		JRST	PQ1
01790	
01800	QQ1:	MOVE	K,OUT(I)
01810		MOVE	L,OUT+112(I)
01820		LSHC	K,-22
01830		MOVEM	L,OUT+112(I)
01840		MOVE	K,SIGTAB(J)	;Get new output
01850		MOVE	L,OUT(I)
01860		LSHC	K,-22		;18-bit fields in output for Q tables
01870		MOVEM	L,OUT(I)
01880		JUMPE	H,PQ8		;0 means no learning
01890		MOVE	Z,H
01900		XOR	Z,LEARN(I)	;Test appropiate phonemes
01910		MOVEI	K,1		;Learning add-bit if phoneme 4
01920		TRNN	Z,77		;Test last field
01930		JRST	QQ2
01940		LSH	K,11
01950		TRNN	Z,7700		;Test next field
01960		JRST	QQ2
01970		LSH	K,11
01980		TRNN	Z,770000	;Test next field
01990		JRST	QQ2
02000		LSH	K,11
02010		TLNN	Z,77
02020		JRST	QQ2
02030		MOVSI	K,1
02040		ADDM	K,SIGTAB(J)
02050		SKIPA
02060	QQ2:	ADDM	K,SIGTAB+112(J)	;Add learning count
02070		LDB	K,UPDPT		;Get update count
02080		ADDI	K,1
02090		DPB	K,UPDPT		;Automatically modulo 4
02100		CAIE	K,2		;Is it time to update this line
02110		JRST	PQ8		;No, lines updated at 2 mod 4
02120		LDB	Z,NOTPT
02130		LDB	K,PH1PT
02140		ADD	Z,K
02150		LDB	K,PH2PT
02160		ADD	Z,K
02170		LDB	K,PH3PT
02180		ADD	Z,K
02190		LDB	K,PH4PT
02200		ADD	Z,K		;Total count for line
02210		LSH	K,4		;Multiply by 16 to start
02220		IDIV	K,Z
02230		ADDI	K,1		;To round
02240		LSH	K,-1		;Now reduce range
02250		CAILE	K,7
02260		MOVEI	K,7		;Limit maximum to 7
02270		DPB	K,OT4PT
02280		MOVE	L,K
02290		MOVEI	R,4
02300		LDB	K,PH3PT		;Repeat for each component
02310		LSH	K,4
02320		IDIV	K,Z
02330		ADDI	K,1
02340		LSH	K,-1
02350		CAILE	K,7
02360		MOVEI	K,7
02370		DPB	K,OT3PT
02380		CAMG	K,L
02390		JRST	.+3
02400		MOVE	L,K
02410		MOVEI	R,3
02420		LDB	K,PH2PT	
02430		LSH	K,4
02440		IDIV	K,Z
02450		ADDI	K,1
02460		LSH	K,-1
02470		CAILE	K,7
02480		MOVEI	K,7
02490		DPB	K,OT2PT
02500		CAMG	K,L
02510		JRST	.+3
02520		MOVE	L,K
02530		MOVEI	R,2
02540		LDB	K,PH1PT
02550		LSH	K,4
02560		IDIV	K,Z
02570		ADDI	K,1
02580		LSH	K,-1
02590		CAILE	K,7
02600		MOVEI	K,7
02610		DPB	K,OT1PT
02620		CAMG	K,L
02630		JRST	.+3
02640		MOVE	L,K
02650		MOVEI	R,1
02660		LDB	K,NOTPT
02670		LSH	K,4
02680		IDIV	K,Z
02690		ADDI	K,1
02700		LSH	K,-1
02710		CAILE	K,7
02720		MOVEI	K,7
02730		DPB	K,NTOPT
02740		CAML	K,L		;Call it a not-any if equal
02750		SETZ	R,
02760		DPB	R,OTXPT
02770	PQ8:	ADDI	I,224		;Double space for Q table
02780		JRST	PQ1		;Go to next table
02790	
02800	XXX:	MOVE	F,TABLET	;For pointers to words in tablet
02810		MOVEI	R,0		;For zeroing ex values as needed
02820	XXX2:	LDB	L,LEVPT		;Get level
02830		JUMPE	L,EV1	;0 level reserved for end of table
02840		LDB	K,IN1(F)
02850		LDB	Z,PAVER		;Used to see if in + state
02860		JUMPE	Z,PXX		;We are since OUT has been shifted
02870	MXX:	CAMGE	K,L		;Is input below threshold
02880		JRST	RET		;Yes so we are still marking time
02890	MPX:	LDB	X,EXSUM		;May be starting a + state so save data
02900		ADD	X,K
02910		DPB	X,EXSUM		;Save now
02920		LDB	J,EXCNT		;Update exception count
02930		ADDI	J,1
02940		DPB	J,EXCNT
02950		LDB	Q,TOLPT		;Now compare with tolerance count
02960		CAMG	J,Q
02970		JRST	RET		;Not enough exceptions to start + state
02980		MOVE	J,OUT(F)	;We are entering + state
03000		LSHC	J,-22		;Make room for new data
03010		MOVEM	J,OUT(F)
03020		MOVEI	Z,1
03025		DPB	Z,SFLAG2	;Set starting flag
03027		AOS	TFLAG2		;Add to main start flag
03030		DPB	X,SEGSUM	;Transfer exsum to segsum
03035		DPB	R,EVSUM		;Starting EVSUM set to zero
03040		DPB	R,EXSUM		;Zero EXSUM
03050		DPB	R,EXCNT		;Also reset excnt
03060		MOVE	Z,SEGC		;Save correct segc
03070		SUB	Z,Q		;Correct for delayed decision
03080		DPB	Z,PPNTA		;Put it into OUT(F)
03090		JRST	RET		;Go to next tablet
03100	
03110	PXX:	CAML	K,L		;We must now test level
03120		JRST	PPX		;Continuation of + state
03130		LDB	X,EXSUM		;May be ending + state but also may not
03140		ADD	X,K		;Save temporarily
03150		DPB	X,EXSUM
03160		LDB	J,EXCNT		;Check on length of exception period
03170		ADDI	J,1
03180		DPB	J,EXCNT
03190		LDB	Q,TOLPT		;Has it reached tolerance limit
03200		CAMG	J,Q
03210		JRST	RET		;No
03220		MOVE	Z,SEGC		;Find end segc
03230		LDB	L,PPNTA
03240		SUB	Z,L
03250		SUB	Z,Q
03260		DPB	Z,PCNT		;Save duration count
03270		LDB	J,SEGSUM
03280		LSH	J,1		;Prepare to round
03290		IDIV	J,Z		;Get average value
03300		ADDI	J,1
03310		LSH	J,-1		;Rounding complete
03320		DPB	J,PAVER		;Save
03330					;SEGSUM now not reset
03340		DPB	R,EXCNT
03350		DPB	R,EXSUM
03370		MOVEi	Z,1
03380		DPB	Z,SFLAG		;Count of staten-off flag
03390		AOS	TFLAG		;Add to count of total state changes
03400		JRST	RET
03410	
03420	PPX:	ADDM	K,ALDATA(F)	;Continuation of normal + state
03430		LDB	J,EXCNT		;Have any exceptions occured
03440		JUMPLE	J,RET		;If not we are through
03450		LDB	X,EXSUM		;Must transfer to segsum
03460		ADDM	X,ALDATA(F)	;Right half is segsum remember
03470		DPB	R,EXCNT
03480		DPB	R,EXSUM		;Reset ex values
03490	RET:	ADDI	F,5
03500		JRST	XXX2		;Go to next TABLET
03510	
03520	PAVER:	POINT	3,OUT(F),2	;Average input during state
03530	PPNTA:	POINT	8,OUT(F),10	;SEGC at start of state
03540	PCNT:	POINT	7,OUT(F),17	;count of segments during state
03550	
03560	LEVPT:	POINT	3,ALDATA(F),3	;Pre-assigned level
03570	TOLPT:	POINT	2,ALDATA(F),5	;Exception tolerance value
03580	EXCNT:	POINT	2,ALDATA(F),7	;Count of exceptions
03590	SFLAG:	POINT	2,ALDATA(F),12	;Count of state changes for this TABLET
03600	EXSUM:	POINT	5,ALDATA(F),17	;Running sum during exception periods
03610	SEGSUM:	POINT	18,ALDATA(F),35	;Running sum during + state
03620	
03630	FINISH:	MOVE	17,[XWD SAVE,0]
03640		BLT	17,17
03650		JRA	16,1(16)
03670	
03680	SAVE:	BLOCK	20
03690	SUM:	Z
03700	
03710	UPDPT:	POINT	2,SIGTAB(J),1	;Space for update record mod 4
03720	NOTPT:	POINT	16,SIGTAB(J),17
03730	PH1PT:	POINT	9,SIGTAB+112(J),8
03740	PH2PT:	POINT	9,SIGTAB+112(J),17
03750	PH3PT:	POINT	9,SIGTAB+112(J),26
03760	PH4PT:	POINT	9,SIGTAB+112(J),35
03780	OTXPT:	POINT	3,SIGTAB(J),35
03790	NTOPT:	POINT	3,SIGTAB(J),20
03800	OT1PT:	POINT	3,SIGTAB(J),23
03810	OT2PT:	POINT	3,SIGTAB(J),26
03820	OT3PT:	POINT	3,SIGTAB(J),29
03830	OT4PT:	POINT	3,SIGTAB(J),32
03850	D2N2:	POINT	3,J,32		;For depositing second input to a 2-input
03860	D2N3:	POINT	2,J,33		;For depositing 2ND input to a 3 input
03870	D3N3:	POINT	2,J,31
03880	D2N6:	POINT	1,J,34
03890	D3N6:	POINT	1,J,33
03900	D4N6:	POINT	1,J,32
03910	D5N6:	POINT	1,J,31
03920	D6N6:	POINT	1,J,30
03930	
03940	BPT3:	POINT	3,L,2		;For first 3 bits of L
03950	BPT12:	POINT	12,L,11		;For first 12 bits of L
03960	GPOINT:	POINT	4,SIGTYP(I),17	;For gating threshold from SIGTYP
03970	TPOINT:	POINT	1,SIGTYP(I),5	;For Q indicator bit in SIGTYP
03980	NPOINT:	POINT	3,SIGTYP(I),11	;For number of inputs
03990	GDPNT:	POINT	16,SIGTAB(J),31	;GOOD field for P type tables
04000	BADPNT:	POINT	16,SIGTAB(J),15	;BAD field for P type tables
04010	SPREAD:	OCT	0,0,1,1		;Can be used to spread outputs
04020		OCT	2,2,3,3
04030		OCT	4,4,5,5
04040		OCT	6,6,7,7,7
04050	
05000	EV1:	SKIPN	TFLAG
05010		SKIPE	TFLAG2
05020		SKIPA
05030		JRST	FINISH		;No state change at this time
05040		MOVE	F,TABLET	;Reset to start of tablet (or later)
05045		ADD	F,TABMRK	;Omit first 5 counters
05050		MOVE	J,SEGC
05060		SUB	J,EVST
05070		CAML	J,EVMIN		;Is interval long enough to be an event
05080		JRST	EV3		;Yes
05090		SKIPN	TFLAG2		;Was this a start
05100		JRST	FINISH		;Ignore turn-off signal for now
05110	EV2:	MOVEM	R,TFLAG2	;Ignore as too short
05120		LDB	L,LEVPT		;Go through counters to turn SFLAG2's off
05130		JUMPE	L,FINISH
05140		LDB	Z,SFLAG2	;Did this one start a little late
05150		JUMPE	Z,EV2A		;No
05160		LDB	Z,SEGSUM	;To compensate for exception delay
05170		DPB	Z,EVSUM
05180		DPB	R,SFLAG2	;Turn flag off
05190	EV2A:	ADDI	F,5		;Go to next counter
05200		JRST	EV2
05210	
05220	EV3:	MOVEM	J,EVNOW		;Save event duration
05230		SUB	J,EVMIN
05240		CAILE	J,77
05250		MOVEI	J,77		;Limit range
05260		MOVE	K,EVDUR
05270		LSHC	J,-6
05280		MOVEM	K,EVDUR		;Save the last 6 event sizes
05290		MOVE	Z,SEGC
05300		MOVEM	Z,EVST		;Reset event start indicator
05310		SETZM	AVE1		;Reset temperary spaces
05320		SETZM	AVE2
05330		SETZM	AVE3
05340		SETZM	EVPH1
05350		SETZM	EVPH2
05360		SETZM	EVPH3
05370	EV4:	LDB	Z,LEVPT
05380		JUMPE	Z,EV9
05390		MOVE	OUT1(F)
05400		LSH	L,-3		;Make room for new output
05410		HLLM	L,OUT1(F)	;Restore left half as shifted
05420		LDB	L,SFLAG		;Did this one just end
05430		JUMPN	L,EV5		;Yes
05440		LDB	L,SFLAG2	;Did it just start
05450		JUMPE	L,EV6		;No
05460		DPB	R,SFLAG2	;Reset
05470		JRST	EV8
05480	
05490	EV5:	LDB	L,TOLPT
05500		MOVE	Z,EVNOW
05510		SUB	Z,L		;This counter ended before event end
05520		JRST	EV7
05530	EV6:	LDB	K,PAVER		;Is it on
05540		JUMPN	K,EV8		;No
05550		MOVE	Z,EVNOW
05560	EV7:	LDB	J,SEGSUM
05570		LDB	K,EVSUM
05580		DPB	J,EVSUM		;Get ready for next event
05590		SUB	J,K
05600		LSH	J,1		;Multiply by 2
05610		IDIV	J,Z
05620		MOVE	K,SPRED2(J)	;Get into range
05630		DPB	K,EVAVER
05640		CAMG	J,AVE3		;Order on value before range compression
05650		JRST	EV8		;This one does not rate
05660		MOVEM	J,AVE3		;Save the 3 largest
05670		MOVE	Z,F		;Get current tablet address
05676	
05680		SUB	Z,TABLET	;Subtract start of tablet
05685		IDIVI	Z,5
05697	
05703	;****TEMPORARY CHANGE WITH DECISIONS LEFT TO SHOW
05705	
05710		MOVEM	Z,EVPH3
05720		CAMG	J,AVE2
05730		JRST	EV8	  	 ;Not as large as present second choice
05740		EXCH	J,AVE2
05750		MOVEM	J,AVE3
05760		MOVE	Z,EVPH2
05770		EXCH	Z,EVPH3
05780		MOVEM	Z,EVPH2
05790		MOVE	J,AVE2
05800		CAMG	J,AVE1
05810		JRST	EV8		;First choice still remains
05820		EXCH	J,AVE1
05830		MOVEM	J,AVE2
05840		EXCH	Z,EVPH1
05850		MOVEM	Z,EVPH2
05860	EV8:	ADDI	F,5
05870		JRST	EV4
05880	
05890	EV9:	MOVE	J,AVE1		;Get into range 0 to 7
05900		JUMPE	J,EV9A
05910		MOVE	K,SPRED2(J)
05920		MOVEM	K,AVE1
05930	EV9A:	MOVE	J,AVE2
05940		JUMPE	J,EV9B
05950		MOVE	K,SPRED2(J)
05960		MOVEM	K,AVE2
05970	EV9B:	MOVE	J,AVE3
05980		JUMPE	J,EV9C
05990		MOVE	K,SPRED2(J)
06000		MOVEM	K,AVE3
06010	EV9C:	SKIPN	AVE2		;Is there a second choice
06030		JRST	EV13		;No
06040		MOVE	J,AVE1		;How different are the two choices
06050		SUB	J,AVE2
06055	
06057		JRST	EV19
06058	;**** TEmporary bypass to leave all decision to SHOW ****
06059	
06060		CAILE	J,ALLOW1
06070		JRST	EV12		;Reasonable to bet on EVPH1
06080		LDB	K,EVXPNT	;Get previous event
06090		MOVE	J,PCLASS(K)	;Classify into 1 of 8 groups
06100		MOVE	L,EVPH1
06110		MOVN	Z,DIPROB(L)	;Get appropiate line from probility table
06120		HRRM	J,.+1
06130		LSH	Z,0		;Address stored above
06140		ANDI	Z,17		;Select probability value
06150		IMUL	Z,AVE1		;Multiply probabilities
06160		MOVE	L,EVPH2
06170		MOVN	K,DIPROB(L)
06180		HRRM	J,.+1
06190		LSH	K,0
06200		ANDI	K,17
06210		IMUL	K,AVE2
06220		CAMLE	Z,K		;Use linguistically modified probabilities
06230		JRST	EV11		;Seems reasonable
06240		CAME	Z,K
06250		JRST	EV10
06260		MOVEI	J,0		;We are in trouble
06270		JRST	EV14
06280	
06290	EV10:	MOVE	Z,AVE2
06300		MOVEM	Z,AVE1
06310		MOVE	Z,EVPH2
06320		MOVEM	Z,EVPH1
06330	EV11:	MOVEI	J,1		;Use 1 for this case
06340		JRST	EV14
06350	
06360	EV12:	LSH	J,1		;Use difference*2 as assurance value
06370		CAILE	J,7
06380		MOVEI	J,7
06390		JRST	EV14
06400	
06410	EV13:	MOVEI	J,7		;Single choice assurance
06420	EV14:	LDB	K,EVXPNT	;Can event merge with previous one
06430		CAMN	K,EVPH1		;Are the names the same now
06440		JRST	EV17		;Yes so modify length data
06450		MOVE	L,SEQUEN(K)	;Maybe they can get a combined name
06460		MOVN	K,EVPH1
06470		HRRM	K,.+1
06480		LSH	L,0
06490		TRNN	L,1
06500		JRST	EV19		;Can not merge
06510		LDB	K,EVXPNT	;Now to find the name
06520		LSH	K,6
06530		ADD	K,EVPH1
06540		MOVEI	L,40		;Assume that there are 32 cases
06550	EV15:	HRRZ	N,MERGET(L)	;Name pairs are in right half word
06560		CAMN	K,N
06570		JRST	EV16
06580		SOJGE	L,EV15
06590		JRST	EV19		;Error, cannot be done
06600	
06610	EV16:	HLLZ	N,MERGET(L)	;Get new name from left half
06620		DPB	N,EVXPNT	;Change name
06630	EV17:	LDB	J,EVDPNT	;Get old duration
06640		ADD	J,EVNOW
06650		DPB	J,EVDPNT
06660		LDB	J,EVAPNT
06670		ADD	J,AVE1
06680		LSH	J,-1		;Average level
06690		DPB	J,EVDPNT
06700		MOVE	J,[7777777777]
06710		ANDM	J,EVENT2	;Zero 2nd and 3rd choices in this case
06720		ANDM	J,EVENT3
06730		JRST	FINISH
06740	
06750	EV19:	MOVE	K,EVSURE
06760		LSHC	J,-6
06770		MOVEM	K,EVSURE
06780	EV20:	MOVE	J,EVPH1		;Save first choice
06790		MOVE	K,EVENTS
06800		LSHC	J,-6
06810		MOVEM	K,EVENTS
06830		MOVE	J,AVE1
06840		MOVE	K,EVAVE
06850		LSHC	J,-6		;Check this it may be wrong
06860		MOVEM	K,EVAVE
06870		MOVE	J,EVPH2		;Keep second and third choices
06880		MOVE	K,EVENT2
06890		LSHC	J,-6
06900		MOVEM	K,EVENT2
06902		MOVE	J,AVE2
06904		MOVE	J,EVAVE2
06906		LSHC	J,-6
06908		MOVEM	J,EVAVE2
06910		MOVE	J,EVPH3
06920		MOVE	K,EVENT3
06930		LSHC	J,-6
06940		MOVEM	K,EVENT3
06942		MOVE	J,AVE3
06944		MOVEM	K,EVAVE3
06946		LSHC	J,-6
06948		MOVEM	K,EVAVE3
06950		AOS	ECOUNT
06960		JRST	FINISH
06970	
06980	AVE1:	Z			;Average level for first choice
06990	AVE2:	Z			;Average level for second choice
07000	AVE3:	Z			;Average level for third choice
07010	EVPH1:	Z			;Counter index for first PH choice
07020	EVPH2:	Z			;Counter index for second choice
07030	EVPH3:	Z			;Counter index for third choice
07040	
07050	TFLAG2:	Z			;Overall turn on flag
07060	EVST:	Z			;SEGC at start of event
07070	EVMIN:	2			;Minimum length event to qualify
07080	ALLOW1:	2			;Safe margin
07090	TABMRK:	36			;Set to 25
07100	EVNOW:	Z			;Current event duration
07110	
07120	SFLAG2:	POINT	2,ALDATA(F),10	;Turn on flag for counter
07130	EVAVER:	POINT	3,OUT1(F),2	;Pointer to last average level
07140	EVSUM:	POINT	18,OUT1(F),35	;Sum at start of event
07150	EVXPNT:	POINT	6,EVENTS,5	;Pointer to last event index number
07160	EVDPNT:	POINT	6,EVDUR,5	;Pointer to last event duration
07170	EVAPNT:	point	6,evave,5	;Pointer to last average level
07180	
07190	EVENTS:	Z			;Last 6 events
07200	EVDUR:	Z			;Last 6 event durations
07210	EVAVE:	Z			;Ave outputs for last 6 events
07220	EVSURE:	Z			;Assurancess for last 6 events
07230	EVENT2:	Z			;Second choices
07232	EVAVE2:	Z			;Ave outputs for last 6 event2`s
07240	EVENT3:	Z			;Third choices
07242	EVAVE3:	z			;Ave output for last 6 event3's
07250	ECOUNT:	Z			;Count of partially edited events
07260	
07270	DIPROB:	BLOCK	100		;Probability of event
07280					; for 8 classes of preceeding event
07290			;This table must be filled in
07300	
07310	PCLASS:	BLOCK	100		;Classification table for events
07320			;This table must be filled in
07330	 
07340	SEQUEN:	BLOCK:	100		;Sequences that can combine
07350			;THIS MUST BE FILLED IN
07360	
07370	MERGET:	BLOCK	40		;Table containing new names for event pairs
07380		;New name in left half word, old name pairs in right half word
07390		;THIS MUST BE FILLED IN
07400	SPRED2:	OCT	1,1,1,1,1,1	;To spread after thresholding
07410		OCT	2,2,3,3,4,4	;Note- 0 is reserved for off counters
07420		OCT	5,6,7,7,7,7
07430	
07440	SPRED3:	OCT	0,0,0,0,0,0,0		;Locations 0,6
07450		OCT	1,1,1,1,1,1		;Losctions 7,12
07460		OCT	2,2,2,2,2,2,2		;Locations 13,19
07470		OCT	3,3,3,3,3,3,3,3		;Locations 20,27
07480		OCT	4,4,4,4,4,4,4,4,4	;Locations 28,36
07490		OCT	5,5,5,5,5,5,5,5,5,5	;Locations 37,46
07500		OCT	6,6,6,6,6,6,6,6,6,6,6	;Locations 47,57
07510		OCT	7,7,7,7,7,7,7,7,7	;Locations 58,up
07520	
07530	COMPAR:	XWD	0,14			;0,12 with 0 assigned for 0,6
07540		XWD	0,23			;0,19 with 1 assigned for 7,12
07550		XWD	7,33			;7,27 with 2 assigned for 13,19
07560		XWD	15,44			;13,36 with 3 assigned for 20,27
07570		XWD	24,56			;20,46 with 4 assigned for 28,36
07580		XWD	34,71			;28,57 with 5 assigned for 37,46
07590		XWD	45,100			;37,64 with 6 assigned for 47,57
07600		XWD	57,100			;47,64 with 7 assigned for 58,up
07610	
07620		END